package pe.gob.osce.sirenas.dao.impl;


import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.TrayectoriaArbitralDAOLocal;
import pe.gob.osce.sirenas.dao.convert.ExperienciaLaboralConvert;
import pe.gob.osce.sirenas.dao.convert.TrayectoriaArbitralConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.ExperienciaLaboralDTO;
import pe.gob.osce.sirenas.model.TrayectoriaArbitralDTO;
import pe.gob.osce.sirenas.model.jpa.ExperienciaLaboral;
import pe.gob.osce.sirenas.model.jpa.Capacitacion;
import pe.gob.osce.sirenas.model.jpa.TrayectoriaArbitral;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialTrayectoriaArbitral;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class TrayectoriaArbitralDAOImpl implements TrayectoriaArbitralDAOLocal {

	@PersistenceContext(unitName = "pe.gob.osce.sirenas.be.pu")
	private EntityManager em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);

	@Override
	public TrayectoriaArbitral insertar(TrayectoriaArbitral trayectoriaArbitral) throws Exception {
		try{
			em.merge(trayectoriaArbitral);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return trayectoriaArbitral;
	}
	
	@Override
    public TrayectoriaArbitral insertarTrayectoria(TrayectoriaArbitral trayectoriaArbitral)
                    throws Exception {
		try{
			trayectoriaArbitral=em.merge(trayectoriaArbitral);
            em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
            return trayectoriaArbitral;
    }
	@Override 
	public TrayectoriaArbitral consultarTrayectoriaArbitral(Long idTrayectoriaArbitral)
			throws Exception {
		TrayectoriaArbitral		trayectoriaArbitralJPA=null;
		List<TrayectoriaArbitral>		listTrayectoriaArbitralJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT tra FROM TrayectoriaArbitral tra WHERE tra.idTrayectoria = :idTrayectoria");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idTrayectoria", idTrayectoriaArbitral);
			
			List<TrayectoriaArbitral> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listTrayectoriaArbitralJPA=new ArrayList<TrayectoriaArbitral>();
				for (TrayectoriaArbitral obj: listaObjeto) {					
					trayectoriaArbitralJPA=(obj);
				}				
			}
		} catch (NoResultException nre) {
			trayectoriaArbitralJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return trayectoriaArbitralJPA;
	}	
	
	@Override
	public Boolean insertarHistorialTrayectoriaArbitral(HistorialTrayectoriaArbitral historialTrayectoriaArbitral)throws Exception  {
		boolean confirmacion=false;
		
		try {
			em.merge(historialTrayectoriaArbitral);
			em.flush();
			confirmacion=true;
		} catch (Exception e) {
			confirmacion=false;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return 	confirmacion;
	}
	
	@Override 
	public List<HistorialTrayectoriaArbitral> consultarHistorialTrayectoriaArbitral(Long idTrayectoriaArbitral)
			throws Exception {
		TrayectoriaArbitral		trayectoriaArbitralJPA=null;
		List<HistorialTrayectoriaArbitral>		listHistorialTrayectoriaArbitralJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT tra FROM HistorialTrayectoriaArbitral tra WHERE tra.idTrayectoria = :idTrayectoria");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idTrayectoria", idTrayectoriaArbitral);
			
			List<HistorialTrayectoriaArbitral> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listHistorialTrayectoriaArbitralJPA=new ArrayList<HistorialTrayectoriaArbitral>();
				for (HistorialTrayectoriaArbitral obj: listaObjeto) {					
					listHistorialTrayectoriaArbitralJPA.add(obj);
				}				
			}
		} catch (NoResultException nre) {
			listHistorialTrayectoriaArbitralJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return listHistorialTrayectoriaArbitralJPA;
	}	
	
	@Override 
	public List<TrayectoriaArbitralDTO>  obtenerListaTrayectoria(Long idFicha,String tipoArbitraje )
			throws Exception {

		List<TrayectoriaArbitralDTO> listTrayectoriaDTO=null;		
		List<TrayectoriaArbitral> listaTrayectoriaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
		
			jpql.append("SELECT  tra FROM TrayectoriaArbitral tra WHERE  tra.idFicha = :idFicha AND tra.estado=1 ");
			if(tipoArbitraje.length()>0)
			{
				jpql.append(" AND tra.tipoTrayectoria= :tipoTrayectoria");
			}

			jpql.append(" ORDER BY tra.indEspecialidad, tra.auditoria.fechaRegistro DESC ");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			if(tipoArbitraje.length()>0)
			{
				query.setParameter("tipoTrayectoria", tipoArbitraje);
			}
			
			List<TrayectoriaArbitral>	listaObjeto= query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listaTrayectoriaJPA=new ArrayList<TrayectoriaArbitral>();
				for (TrayectoriaArbitral obj: listaObjeto) {					
					listaTrayectoriaJPA.add(obj);
				}
				listTrayectoriaDTO=TrayectoriaArbitralConvert.createListDTO(listaTrayectoriaJPA);
			}
			
		} catch (NoResultException nre) {
			listTrayectoriaDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listTrayectoriaDTO;
	}
	
	
}
